home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / xip / iijppp.lzh / src / pap.c < prev    next >
C/C++ Source or Header  |  1994-10-10  |  4KB  |  162 lines

  1. /*
  2.  *            PPP PAP Module
  3.  *
  4.  *        Written by Toshiharu OHNO (tony-o@iij.ad.jp)
  5.  *
  6.  *   Copyright (C) 1993-94, Internet Initiative Japan, Inc.
  7.  *             All rights reserverd.
  8.  *
  9.  * Redistribution and use in source and binary forms are permitted
  10.  * provided that the above copyright notice and this paragraph are
  11.  * duplicated in all such forms and that any documentation,
  12.  * advertising materials, and other materials related to such
  13.  * distribution and use acknowledge that the software was developed
  14.  * by the Internet Initiative Japan, Inc.  The name of the
  15.  * IIJ may not be used to endorse or promote products derived
  16.  * from this software without specific prior written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  19.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  *
  21.  *    TODO:
  22.  *        o Imprement retransmission timer.
  23.  */
  24. #include "fsm.h"
  25. #include "lcp.h"
  26. #include "pap.h"
  27. #include "vars.h"
  28. #include "hdlc.h"
  29. #include "lcpproto.h"
  30. #include "phase.h"
  31.  
  32. static char *papcodes[] = {
  33.   "???", "REQUEST", "ACK", "NAK"
  34. };
  35.  
  36. static int papid;
  37.  
  38. void
  39. SendPapChallenge()
  40. {
  41.   struct fsmheader lh;
  42.   struct mbuf *bp;
  43.   u_char *cp;
  44.   int namelen, keylen, plen;
  45.  
  46.   namelen = strlen(VarAuthName);
  47.   keylen = strlen(VarAuthKey);
  48.   plen = namelen + keylen + 2;
  49. #ifdef DEBUG
  50.   logprintf("namelen = %d, keylen = %d\n", namelen, keylen);
  51.   LogPrintf(LOG_PHASE, "PAP: %s (%s)\n", VarAuthName, VarAuthKey);
  52. #endif
  53.   lh.code = PAP_REQUEST;
  54.   lh.id = ++papid;
  55.   lh.length = htons(plen + sizeof(struct fsmheader));
  56.   bp = mballoc(plen + sizeof(struct fsmheader), MB_FSM);
  57.   bcopy(&lh, MBUF_CTOP(bp), sizeof(struct fsmheader));
  58.   cp = MBUF_CTOP(bp) + sizeof(struct fsmheader);
  59.   *cp++ = namelen;
  60.   bcopy(VarAuthName, cp, namelen);
  61.   cp += namelen;
  62.   *cp++ = keylen;
  63.   bcopy(VarAuthKey, cp, keylen);
  64.  
  65.   HdlcOutput(PRI_NORMAL, PROTO_PAP, bp);
  66. }
  67.  
  68. static void
  69. SendPapCode(id, code, message)
  70. int id;
  71. char *message;
  72. int code;
  73. {
  74.   struct fsmheader lh;
  75.   struct mbuf *bp;
  76.   u_char *cp;
  77.   int plen, mlen;
  78.  
  79.   lh.code = code;
  80.   lh.id = id;
  81.   mlen = strlen(message);
  82.   plen = mlen + 1;
  83.   lh.length = htons(plen + sizeof(struct fsmheader));
  84.   bp = mballoc(plen + sizeof(struct fsmheader), MB_FSM);
  85.   bcopy(&lh, MBUF_CTOP(bp), sizeof(struct fsmheader));
  86.   cp = MBUF_CTOP(bp) + sizeof(struct fsmheader);
  87.   *cp++ = mlen;
  88.   bcopy(message, cp, mlen);
  89.   LogPrintf(LOG_PHASE, "PapOutput: %s\n", papcodes[code]);
  90.   HdlcOutput(PRI_NORMAL, PROTO_PAP, bp);
  91. }
  92.  
  93. /*
  94.  * Validate given username and passwrd against with secret table
  95.  */
  96. static int
  97. PapValidate(name, key)
  98. u_char *name, *key;
  99. {
  100.   int nlen, klen;
  101.  
  102.   nlen = *name++;
  103.   klen = *key;
  104.   *key++ = 0;
  105.   key[klen] = 0;
  106.   logprintf("name: %s (%d), key: %s (%d)\n", name, nlen, key, klen);
  107.   return(AuthValidate(SECRETFILE, name, key));
  108. }
  109.  
  110. void
  111. PapInput(bp)
  112. struct mbuf *bp;
  113. {
  114.   int len = plength(bp);
  115.   struct fsmheader *php;
  116.   struct lcpstate *lcp = &LcpInfo;
  117.   u_char *cp;
  118.  
  119.   if (len >= sizeof(struct fsmheader)) {
  120.     php = (struct fsmheader *)MBUF_CTOP(bp);
  121.     if (len >= ntohs(php->length)) {
  122.       if (php->code < PAP_REQUEST || php->code > PAP_NAK)
  123.     php->code = 0;
  124.       LogPrintf(LOG_PHASE, "PapInput: %s\n", papcodes[php->code]);
  125.  
  126.       switch (php->code) {
  127.       case PAP_REQUEST:
  128.     cp = (u_char *) (php + 1);
  129.     if (PapValidate(cp, cp + *cp + 1)) {
  130.       SendPapCode(php->id, PAP_ACK, "Greetings!!");
  131.       lcp->auth_ineed = 0;
  132.       if (lcp->auth_iwait == 0)
  133.         NewPhase(PHASE_NETWORK);
  134.     } else {
  135.       SendPapCode(php->id, PAP_NAK, "Login incorrect");
  136.       LcpClose();
  137.     }
  138.     break;
  139.       case PAP_ACK:
  140.     cp = (u_char *)(php + 1);
  141.     len = *cp++;
  142.     cp[len] = 0;
  143.     LogPrintf(LOG_PHASE, "Received PAP_ACK (%s)\n", cp);
  144.     if (lcp->auth_iwait == PROTO_PAP) {
  145.       lcp->auth_iwait = 0;
  146.       if (lcp->auth_ineed == 0)
  147.         NewPhase(PHASE_NETWORK);
  148.     }
  149.     break;
  150.       case PAP_NAK:
  151.     cp = (u_char *)(php + 1);
  152.     len = *cp++;
  153.     cp[len] = 0;
  154.     LogPrintf(LOG_PHASE, "Received PAP_NAK (%s)\n", cp);
  155.     LcpClose();
  156.     break;
  157.       }
  158.     }
  159.   }
  160.   pfree(bp);
  161. }
  162.